package com.example.service;


import com.example.dao.TypeInfoDao;
import org.springframework.stereotype.Service;
import com.example.entity.TypeInfo;
import com.example.entity.Account;
import com.example.vo.TypeInfoVo;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.List;

/**
 * 文件类型信息服务层
 * <p>
 * 处理文件类型相关的业务逻辑，包含类型信息的增删改查、分页查询及条件检索功能
 * </p>
 * <p>
 * 注意：当前实现包含硬编码参数"all"，需与DAO层特殊处理逻辑配合使用
 * </p>
 */
@Service
public class TypeInfoService {

    @Resource
    private TypeInfoDao typeInfoDao;

    /**
     * 添加新文件类型
     *
     * @param typeInfo 类型信息实体对象（至少需要包含name等关键字段）
     * @return 插入后的完整类型信息对象（包含数据库生成的ID等字段）
     */
    public TypeInfo add(TypeInfo typeInfo) {
        typeInfoDao.insertSelective(typeInfo);
        return typeInfo;
    }

    /**
     * 物理删除文件类型
     *
     * @param id 要删除的类型记录主键ID
     * @throws org.springframework.dao.EmptyResultDataAccessException 当ID不存在时抛出空结果异常
     */
    public void delete(Long id) {
        typeInfoDao.deleteByPrimaryKey(id);
    }

    /**
     * 更新文件类型信息（仅更新非空字段）
     *
     * @param typeInfo 包含更新字段的类型信息实体（必须包含有效ID）
     * @throws IllegalArgumentException 当传入对象ID为空时抛出参数异常
     */
    public void update(TypeInfo typeInfo) {
        typeInfoDao.updateByPrimaryKeySelective(typeInfo);
    }

    /**
     * 根据主键ID查询类型详情
     *
     * @param id 类型记录主键ID
     * @return 对应的类型信息实体（找不到时返回null）
     */
    public TypeInfo findById(Long id) {
        return typeInfoDao.selectByPrimaryKey(id);
    }

    /**
     * 查询所有类型信息（特殊实现）
     *
     * @return 类型视图对象列表（通过传入硬编码参数"all"触发DAO层全量查询）
     */
    public List<TypeInfoVo> findAll() {
        return typeInfoDao.findByName("all");
    }

    /**
     * 分页条件查询类型信息
     *
     * @param name     类型名称关键词（支持模糊查询，传null表示不限制）
     * @param pageNum  当前页码（从1开始计数）
     * @param pageSize 每页显示记录数（建议值：10-100）
     * @param request  HTTP请求对象（预留参数，当前版本未使用）
     * @return PageInfo<TypeInfoVo> 分页结果包装对象（包含总记录数、当前页数据、分页导航参数等）
     * @throws IllegalArgumentException 当pageNum<1或pageSize<1时抛出参数异常
     */
    public PageInfo<TypeInfoVo> findPage(String name, Integer pageNum, Integer pageSize, HttpServletRequest request) {
        PageHelper.startPage(pageNum, pageSize);
        List<TypeInfoVo> all = findAllPage(request, name);
        return PageInfo.of(all);
    }

    /**
     * 内部条件查询实现（供分页查询调用）
     *
     * @param request HTTP请求对象（预留参数，当前版本未使用，后续可扩展权限校验）
     * @param name    类型名称关键词（模糊查询条件）
     * @return 匹配的类型视图对象列表
     */
    public List<TypeInfoVo> findAllPage(HttpServletRequest request, String name) {
		return typeInfoDao.findByName(name);
    }

}
